package com.pikaqiu.warehouse.utils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * 1. HmacRipeMD160编码结果需要转换成hex格式
 *
 * 2. java中base64的实现和php不一致,其中java并不会在字符串末尾填补=号以把字节数补充为8的整数
 *
 * 3. HmacRipeMD160并非sha1, HmacRipeMD160是需要共享密钥的
 *
 * @author nuomiphp
 *
 */
public class JavaHashHmac {

    private static final String HMAC_SHA1 = "HmacSHA1";


    /**
     * 加密前缀
     */
    private static final String key = "i3d6o32wo8fvs1fvdpwens";

    /**
     * 使用 HMAC-SHA1 签名算法对data进行签名
     * @param data 被签名的字符串
     * @return 加密后的字符串
     */
    public static String getSignature(String data){
        //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1);
        //生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = null;
        try {
            mac = Mac.getInstance(HMAC_SHA1);
            //用给定密钥初始化 Mac 对象
            mac.init(signinKey);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException(e);
        }
        //完成 Mac 操作
        byte[] rawHmac = mac.doFinal(data.getBytes());
        return byte2hex(rawHmac);
    }

    private static String byte2hex(final byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            // 以十六进制（基数 16）无符号整数形式返回一个整数参数的字符串表示形式。
            stmp = (Integer.toHexString(b[n] & 0xFF));
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
        }
        return hs;
    }
}
